package vue.onglets;
import java.awt.*;
import java.io.*;
import java.util.Vector;
import javax.swing.*;

import controle.ControleActionOnglet;
import modele.*;
import fichier.Chargement;
import gnu.jpdf.PDFTest;
import vue.panneau3.Zone3;

public class ListeOnglets extends JTabbedPane
{
	private static final long serialVersionUID = 1L;
	private JFileChooser jfc;
	private int numero;
	
	public ListeOnglets(MenuContextuelOnglet mco)
	{		
		numero = 0;
		this.addMouseListener(new ControleActionOnglet(this,mco));
	}
	
	public void ajoutOnglet(String libelle)
	{
		numero++;
		Onglet newOnglet = null;
		
		if(libelle.equals("Nouveau2D"))
		{
			newOnglet = new Onglet(false/*is3D = false*/);
		}
		
		if(libelle.equals("Nouveau3D"))
		{
			newOnglet = new Onglet(true/*is3D = true*/);			
		}
		this.addTab(libelle + " (" + numero + ")",newOnglet);
		this.setSelectedComponent(newOnglet);
	}
	
	@SuppressWarnings("unchecked")
	public void ouvrir()
	{
		if(jfc == null)
		{
			jfc = new JFileChooser(System.getProperty("user.dir"));
			jfc.removeChoosableFileFilter(jfc.getFileFilter());
			jfc.addChoosableFileFilter(new Filtre());
		}
		
		// possibilite d'ouvrir plusieurs fichiers a la fois
		jfc.setMultiSelectionEnabled(true);
		jfc.setSelectedFile(null);
		
		if(jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
		{
			File fic;
			File[] tabFic = jfc.getSelectedFiles();		
					
			for (int i=0;i<tabFic.length;i++)
			{
				if(tabFic[i].exists())
				{	
					fic = tabFic[i];
					
					// si le fichier est deja ouvert
					if(!this.fichierDejaOuvert(fic))
					{					
						// parsage du fichier a ouvrir
						Chargement parser = new Chargement(fic);
						
						// creation du nouvel onglet
						Onglet newOnglet = new Onglet(fic,parser.is3D());
						
						if(parser.is3D())
						{
							// recuperation des donnees
							Vector<Equation3D> listeEquations = (Vector<Equation3D>)parser.recupererListeEquations();
							FonctionAOptimiser3D fct3D = (FonctionAOptimiser3D)parser.recupererFonctionAOptimiser();
							
							// chargement des equations dans la zone 1
							newOnglet.charger3D(listeEquations,fct3D);
							
							// ajout de l'onglet
							this.addTab(fic.getName(),newOnglet);
						}
						else
						{
							// recuperation des donnees
							Vector<Equation2D> listeEquations = (Vector<Equation2D>)parser.recupererListeEquations();
							FonctionAOptimiser2D fct2D = (FonctionAOptimiser2D)parser.recupererFonctionAOptimiser();
							
							// chargement des equations dans la zone 1
							newOnglet.charger2D(listeEquations,fct2D);
							
							// ajout de l'onglet
							this.addTab(fic.getName(),newOnglet);
						}
						this.setSelectedComponent(newOnglet);
						this.setToolTipTextAt(this.getSelectedIndex(),fic.getPath());
					}
				}	
			}
		}
		jfc = null;
	}
	
	@SuppressWarnings("unchecked")
	public void ouvrir(File[] tabFic)
	{
			File fic = null;	
					
			for (int i=0;i<tabFic.length;i++)
			{
				if(tabFic[i].exists())
				{	
					fic = tabFic[i];
					
					// si le fichier est deja ouvert
					if(!this.fichierDejaOuvert(fic))
					{					
						// parsage du fichier a ouvrir
						Chargement parser = new Chargement(fic);
						
						// creation du nouvel onglet
						Onglet newOnglet = new Onglet(fic,parser.is3D());
						
						if(parser.is3D())
						{
							// recuperation des donnees
							Vector<Equation3D> listeEquations = (Vector<Equation3D>)parser.recupererListeEquations();
							FonctionAOptimiser3D fct3D = (FonctionAOptimiser3D)parser.recupererFonctionAOptimiser();
							
							// chargement des equations dans la zone 1
							newOnglet.charger3D(listeEquations,fct3D);
							
							// ajout de l'onglet
							this.addTab(fic.getName(),newOnglet);
						}
						else
						{
							// recuperation des donnees
							Vector<Equation2D> listeEquations = (Vector<Equation2D>)parser.recupererListeEquations();
							FonctionAOptimiser2D fct2D = (FonctionAOptimiser2D)parser.recupererFonctionAOptimiser();
							
							// chargement des equations dans la zone 1
							newOnglet.charger2D(listeEquations,fct2D);
							
							// ajout de l'onglet
							this.addTab(fic.getName(),newOnglet);
						}
						this.setSelectedComponent(newOnglet);
						this.setToolTipTextAt(this.getSelectedIndex(),fic.getPath());
					}
				}	
			}
		jfc = null;
	}
	
	private boolean fichierDejaOuvert(File fic)
	{
		boolean trouve = false;
		int i=0;
		while(i<this.getTabCount() && !trouve)
		{
			Onglet onglet = (Onglet)this.getComponentAt(i);
			File ficOnglet = onglet.getFichier();
			
			if(ficOnglet != null && ficOnglet.getPath().equals(fic.getPath()))
			{
				trouve = true;
				// on affiche l'onglet du fichier deja ouvert
				this.setSelectedIndex(i);
			}
			else i++;
		}
		return trouve;
	}
	
	public void fermerOnglet()
	{
		this.remove(this.getSelectedIndex());
	}
	
	public void fermerToutSaufMoi()
	{
		Onglet ongletCourant = (Onglet)this.getSelectedComponent();
		for(int i=0;i<this.getComponentCount();i++)
		{
			if(this.getComponentAt(i) != ongletCourant)
			{
				this.removeTabAt(i);
				i--;
			}			
		}
	}
	
	public void fermerTout()
	{
		this.removeAll();
	}
	
	public void enregistrer()
	{
		Onglet ongletCourant = (Onglet)this.getSelectedComponent();
		int index = this.getSelectedIndex();
		File f = ongletCourant.getFichier();
		
		if(f != null)
		{
			ongletCourant.enregistrer(new File(f.getAbsolutePath()));
		}
		else
		{
			File newfic = this.enregistrerSous();
			if(newfic != null)
			{
				ongletCourant.setFichier(newfic);
				this.setTitleAt(index,ongletCourant.getFichier().getName());
				this.setToolTipTextAt(this.getSelectedIndex(),ongletCourant.getFichier().getPath());
			}
		}
	}
	
	public File enregistrerSous()
	{
		Onglet ongletCourant = (Onglet)this.getSelectedComponent();
		
		if(jfc == null)
		{
			jfc = new JFileChooser(System.getProperty("user.dir"));
			jfc.removeChoosableFileFilter(jfc.getFileFilter());
			jfc.addChoosableFileFilter(new Filtre());
		}
		
		jfc.setDialogTitle("Enregistrer sous");		
	    if(jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
	    {
			File f = jfc.getSelectedFile();
			if(f.exists()) 
			{
				int reponse = JOptionPane.showConfirmDialog(null,
						f.getPath()
			            + "\" existe déjà.\nVoulez-vous le remplacer ?", 
			            "Enregistrer sous",
			            JOptionPane.YES_NO_OPTION, 
			            JOptionPane.WARNING_MESSAGE);
				
				// si on veut pas le remplacer
				if(reponse == JOptionPane.NO_OPTION)
			    {
			        this.enregistrerSous();
			    }
				
				// si le fichier est deja ouvert
				if(this.fichierDejaOuvert(f))
				{
					JOptionPane.showConfirmDialog(null,"Le fichier est déjà ouvert dans Simplexe.",
							"ERROR",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE);
					return null;
				}
			}
			jfc = null;
			return ongletCourant.enregistrer(f);
	    }
	    else
	    {
	    	jfc = null;
	    	return null;
	    }
	}
	
	public void imprimer()
	{
		Onglet onglet = (Onglet)this.getSelectedComponent();
		Zone3 z3 = onglet.getZone3();
		
		PrintJob demandeImpression = z3.getToolkit().getPrintJob(new JFrame(),"Impression",null);
		if(demandeImpression != null)
		{
			Graphics gImpr = demandeImpression.getGraphics();
			// imprime la zone 3
			z3.printAll(gImpr); 
			gImpr.dispose();
			// termine l'impression
			demandeImpression.end(); 
		}
	}
	
	public void exporterPDF()
	{
		Onglet onglet = (Onglet)this.getSelectedComponent();
		Zone3 z3 = onglet.getZone3();
		
		JFileChooser jf = new JFileChooser();
		jf.setDialogType(JFileChooser.SAVE_DIALOG);
		jf.setFileSelectionMode(JFileChooser.FILES_ONLY);
		jf.setMultiSelectionEnabled(false);
		
		if (jf.showDialog(this,"enregistrer") == JFileChooser.APPROVE_OPTION) 
		{
			new PDFTest(jf.getSelectedFile().getAbsolutePath(),z3.getModele().getDessinImage(),true);
		}		
	}	
	
	public void selectionnerEtatPrecedent()
	{
		Onglet onglet = (Onglet)this.getSelectedComponent();
		onglet.selectionnerEtapePrecedente();
	}
	
	public void selectionnerEtatSuivant()
	{
		Onglet onglet = (Onglet)this.getSelectedComponent();
		onglet.selectionnerEtapeSuivante();
	}
}
